﻿//using System;
//using System.Collections.Generic;
//using Petra.Gis;
//using Petra.Gis.Geometry.Support;
//using Petra.Gis.ReferenceSystemServices;
//using Petra.Gis.ReferenceSystemServices.Transformations;

//namespace Petra.Gis.RenderingServices.PlanarBase 
//{
//  /// <summary>
//  /// represents simple 2d map with projected coordinate system 
//  /// that can display gis data in cartesian coords or
//  /// in geographic coords when planar projection is applied
//  /// no map drawing or rendering methods implemented
//  /// </summary>
//  public abstract class PlanarMap //: IPlanarMap
//  {
//    protected MapLegend _legend;
//    protected Renderer _renderer;
//    protected PlanarMapExtent _extent;
//    protected ProjectedCoordinateSystem _mapCRS;
//    protected bool _useSpatialFilter;
//    protected SRSTransformCache _srsTransformCache;
//    protected MapPaperUnit _paperOrDisplayUnit;
//    protected double _mapMeterPerUnit;


//    private PlanarMap(float width, float height, ProjectedCoordinateSystem mapCrs, double nominalMapScale, MapPaperUnit paperOrDisplayUnit)
//    {
//      this.Width = width;
//      this.Height = height;

//      //prepare coordinate system
//      _mapCRS = mapCrs;

//      //prepare cache for used transformations
//      _srsTransformCache = new SRSTransformCache(this);

//      //map scale
//      _nominalScale = nominalMapScale;

//      //new legend
//      _legend = new MapLegend(this);

//      //_renderer = new Renderer(this);

//      _paperOrDisplayUnit = paperOrDisplayUnit;


//      if (_paperOrDisplayUnit == MapPaperUnits.Px)
//      { 
//        //todo: load dpi def from preferences...
//        //now set default 96 dpi
//        _mapMeterPerUnit = 1.0 / 3780;
//      }
//      else
//        _mapMeterPerUnit = _paperOrDisplayUnit.MetersPerUnit;

//    }


//    //public PlanarMap(float width, float height, ProjectedCoordinateSystem mapCrs, double nominalMapScale, MapPaperUnit paperOrDisplayUnit, BoundingBox bounds)
//    //  :this(width, height, mapCrs, nominalMapScale, paperOrDisplayUnit)
//    //{

//    //  //map extent
//    //  if (bounds == null)
//    //    throw new ArgumentException("bounds null");

//    //  _extent = new MapExtent(this, bounds);

//    //}




//    //public PlanarMap(float width, float height, ProjectedCoordinateSystem mapCrs, double nominalMapScale, MapPaperUnit paperOrDisplayUnit, string mapTitle)
//    //  : this(width, height, mapCrs, nominalMapScale, paperOrDisplayUnit)
//    //{


//    //  //map extent
//    //  if (_mapCRS.DefaultEnvelope != null)
//    //    _extent = new MapExtent(this, _mapCRS.DefaultEnvelope);
//    //  else
//    //    //no any map extent supplied, create temporary
//    //    _extent = new MapExtent(this, 0, 0, 1, 1);
//    //}



//    public bool ApplyMapRangleAsSpatialFilter
//    {
//      get { return _useSpatialFilter; }
//      set { _useSpatialFilter = value; }
//    }



//    //must implement in inherited
//    protected abstract MapLegend mapLegend { get;}



//    public MapLegend Legend
//    {
//      get { return _legend; }
//    }



//    public virtual SRSTransformCache SRSTransformCache
//    {
//      get { return _srsTransformCache; }
//    }



//    public Renderer CreateRenderer(System.Type geometryType)
//    {
//      return _renderer;
//    }



//    protected abstract Renderer mapCreateRenderer(System.Type geometryType);



//    //no need to override
//    public PlanarMapExtent Extent
//    {
//      get { return _extent; }
//      set
//      {
//        if (value == null)
//          throw new ArgumentException("invalid null reference extent", "extent");

//        _extent = value;
//      }
//    }




//    //no need to override
//    public virtual ProjectedCoordinateSystem ProjectedCoordinateSystem
//    {
//      get { return _mapCRS; }
//      set 
//      {
//        if (value == null)
//          throw new ArgumentException("invalid null reference object", "object");

//        if (value.EqualParams(_mapCRS, false))
//          _mapCRS = value;
//        else
//        {
//          //clear transform cache
//          _srsTransformCache.Clear();
//          //todo: clear output map
//        }
//      }
//    }




//    //this must be implemented in inherited
//    //protected abstract object mapDraw();


//    ////empty function for this abstract class
//    //public object draw()
//    //{ 
//    //  return null; //for now...
//    //}


//    private float _width;

//    public virtual float Width
//    {
//      get { return _width; }
//      set 
//      {
//        if (value <= 0)
//          throw new ArgumentException("invalid map width specified");

//        _width = value;
//        this.Resize(_width, _height);
//      }
//    }




//    private float _height;

//    public virtual float Height
//    {
//      get { return _height; }
//      set
//      {
//        if (value <= 0)
//          throw new ArgumentException("invalid map width specified");

//        _height = value;
//        this.Resize(_width, _height);
//      }
//    }



//    public virtual void Resize(float width, float height)
//    {


//      _extent.Resize(width, height);

//      //rerender whole map content after resize when sized up
//      refreshMapContent();
//    }




//    double _nominalScale;

//    public virtual double NominalScale
//    {
//      get { return _nominalScale; }
//      set 
//      {
//        if (value < 1)
//          throw new ArgumentException("invalid scale: " + value.ToString());
//        _nominalScale = value; 

//        //refresh map content...
//        refreshMapContent();
//      }
//    }



//    protected virtual void refreshMapContent()
//    {
//      //render in bottm to top order !!
//      for (int i = this.Legend.DisplayOrder.Count - 1; i >= 0 ; i--)
//        this.Legend.DisplayOrder[i].RenderData();
    
//    }



//  }
//}
